package _09types

import "fmt"

func NewUser() {
	u := User{}
	println(u.Name)
	fmt.Printf("%v \n", u)
	fmt.Printf("%+v \n", u)

	var u1 User
	println(u1.Name)

	up := &User{}
	fmt.Printf("up %+v \n", up)
	fmt.Printf("up %+v \n", *up)
	up2 := new(User)
	println(up2.FirstName)
	fmt.Printf("up2 %+v \n", up2)

	u4 := User{Name: "Tom", Age: 0}
	u5 := User{"FirstName", "Tom", 0}

	u4.Name = "Jerry"
	u5.Age = 18

	var up3 *User
	println(up3.FirstName)
	println(up3)

}

type User struct {
	Name      string
	FirstName string
	Age       int
}

func (u User) ChangeName(name string) {
	fmt.Printf("changename中u的地址 %p \n", &u)
	u.Name = name
}

// 方法接收器
func (u *User) ChangeAge(age int) {
	fmt.Printf("changeage中u的地址 %p \n", &u)
	fmt.Printf("changeage中age的地址 %p \n", &u.Age)
	u.Age = age
}

func ChangeUser() {
	//u1 := User{
	//	Name: "Tom",
	//	Age:  18,
	//}
	//fmt.Printf("u1的地址 %p \n", &u1)
	//// 如果是指针调用，虽然指针的地址不一样，指针指向的值的地址是一样的
	//// &u.Age  和 &u1.Age  地址是相同的
	//(&u1).ChangeAge(35)
	//fmt.Printf("u1中age的地址 %p \n", &u1.Age)
	//fmt.Printf("%+v \n", u1)
	//
	//u1.ChangeName("Jerry")
	//fmt.Printf("%+v \n", u1)

	up1 := &User{}
	up1.ChangeName("Jerry")
	up1.ChangeAge(35)
	fmt.Printf("%+v \n", up1)

}
